 #include "addfunc.h"
#include "ui_addfunc.h"
#include "inputfunc.h"
#include <QColorDialog>
#include <QString>
#include "ui_inputfunc.h"

Addfunc::Addfunc(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Addfunc)
{
    ui->setupUi(this);
    setWindowTitle("编辑函数");
    setFixedSize(413,471);

    function= nullptr;
    //事件过滤器安装到UI界面中的几个控件上，以便在控件上发生特定的事件时，能够触发eventFilter() 进行相应的处理
    ui->editbtn->installEventFilter(this);
    ui->OKbtn->installEventFilter(this);
    ui->add->installEventFilter(this);
    ui->color->installEventFilter(this);
    ui->Xmin->installEventFilter(this);
    ui->Xmax->installEventFilter(this);
}

bool Addfunc::eventFilter(QObject *obj, QEvent *e)
{
    switch (e->type())//根据 e 指向的对象类型来决定执行哪个分支语句。
    {
        case QEvent::StyleAnimationUpdate://在UI的样式动画更新时被触发
        //这里主要做的是对两个UI上的滑动条(ui->Xmax和ui->Xmin)的值进行检查和修改。
        {
            if(obj==ui->Xmax||ui->Xmin)
            {
                if(ui->Xmax->value() -ui->Xmin->value()<0.05)
                {
                    ui->Xmin->setValue(ui->Xmax->value()-0.05);
                }
            }
            return true;
        }
        case QEvent::MouseButtonPress://处理鼠标点击事件
        {
            if(obj==ui->color)
            {
                auto c=QColorDialog::getColor();//打开一个颜色对话框，让用户选择一种颜色
                if(c.isValid())//如果选择的颜色有效（即用户没有点击对话框的“取消”按钮），则将其设置为ui->color的文本值
                    ui->color->setText(c.name());
            }
            else if(obj==ui->editbtn||obj==ui->add)//点击编辑窗口或者按钮进入inputfunc
            {
                Inputfunc* Input=new Inputfunc(this);
                Input->ui->input->setText(this->ui->add->text());//用户在input输入框中输入文本时，该文本将被复制到add输入框中
                connect(Input,&Inputfunc::onOK,this, &Addfunc::setFunc);//监听
                Input->open();
            }
            else if(obj==this->ui->OKbtn)//点击ok
            {

                if(function!= nullptr)
                {
                    //将用户编辑的内容传出去
                    function->mystyle=ui->style->currentIndex()+1;
                    function->mycolor=ui->color->text().toStdString();//将文本控件中的文本内容转换为 C++ 标准字符串对象
                    function->mymin=ui->Xmin->value();
                    function->mymax=ui->Xmax->value();
                    function->mystep=ui->precision->value();
                    //value() 是一个函数，常常用于获取 Qt 框架中的各种控件对象的当前值

                    emit hitOK(function);
                }
                this->close();
            }
            break;
        }
    }
    return QDialog::eventFilter(obj,e);
}

void Addfunc::setFunc(std::string &expr,std::vector<std::any> & post)
{
    function=new MyFunc;
    function->myexpr=std::move(expr);//移动语义，将对象expr和post移动到变量myexpr和mypostExpr中
    function->mypostExpr=std::move(post);//逆波兰表达式
    this->ui->add->setText(QString::fromStdString(function->myexpr));//QString和std::string相互转换。传出函数解析式
}

Addfunc::~Addfunc()
{
    delete ui;
}
